//package com.sdhs.mob.front.wechat.util;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.sdhs.mob.common.constant.RedisConstant;
//import com.sdhs.mob.common.constant.SysParamConstant;
//import com.sdhs.mob.common.redis.CommonRedis;
//import com.sdhs.mob.common.utils.RequestUtil;
//import com.sdhs.mob.common.utils.SysParamsUtil;
//import com.sdhs.mob.front.estation.base.bean.po.EsUserPO;
//import com.sdhs.mob.utils.HttpUtil;
//import jodd.util.Base64;
//import org.apache.commons.lang.StringUtils;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.dom4j.Document;
//import org.dom4j.io.SAXReader;
//
//import javax.servlet.http.HttpServletRequest;
//import java.io.ByteArrayInputStream;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.net.URLEncoder;
//import java.security.MessageDigest;
//import java.util.Observable;
//import java.util.concurrent.TimeUnit;
//
///**
// * 微信工具类
// *
// * @author seer
// * @date 2018/3/23 16:51
// */
//public class WechatUtil extends Observable {
//
//    public static final String SESSION_WECHAT_USER = "session.wechat.user";
//
//    private static final String SESSION_OPEN_ID = "session.openid";
//
//    private static Logger LOGGER = LogManager.getLogger(WechatUtil.class);
//
//    private static CommonRedis commonRedis;
//
//    /**
//     * 拉取用户信息
//     *
//     * @param code   领取会员卡用户获得的code
//     * @param cardId 卡券ID
//     * @return
//     * @throws Exception
//     */
//    public static String getMemberCardUserInfo(String code, String cardId)
//            throws Exception {
//        StringBuffer url = new StringBuffer(
//                "https://api.weixin.qq.com/card/membercard/userinfo/get?access_token=");
//        url.append(getAccessToken());
//
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("card_id", cardId);
//        jsonObject.put("code", code);
//        return HttpUtil.doPost(url.toString(), jsonObject.toJSONString());
//    }
//
//    /**
//     * 获取session中的用户信息
//     *
//     * @param request
//     * @return
//     */
//    public static EsUserPO getSessionUser(HttpServletRequest request) {
//        return (EsUserPO) request.getSession().getAttribute(SESSION_WECHAT_USER);
//    }
//
//    /**
//     * 保存用户到session中
//     *
//     * @param request
//     * @param user
//     */
//    public static void setSessionUser(HttpServletRequest request, EsUserPO user) {
//        request.getSession().setAttribute(SESSION_WECHAT_USER, user);
//    }
//
//    /**
//     * 刷新微信access_token
//     */
//    public static void refreshAccessToken() {
//
//        StringBuffer url = new StringBuffer(
//                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=");
//        url.append(SysParamsUtil.getSysParams(SysParamConstant.WECHAT_APPID));
//        url.append("&secret=");
//        url.append(SysParamsUtil.getSysParams(SysParamConstant.WECHAT_APPSECRET));
//        String jsonStr;
//        try {
//            jsonStr = HttpUtil.doGet(url.toString());
//        } catch (Exception e) {
//            LOGGER.error("==== 微信 刷新access_token 异常", e);
//            return;
//        }
//        if (StringUtils.isEmpty(jsonStr)) {
//            LOGGER.error("==== 微信 刷新access_token 错误 返回信息为空");
//            return;
//        }
//
//        JSONObject jsonObject = JSON.parseObject(jsonStr);
//        if (jsonObject.containsKey("errcode")) {
//            LOGGER.error(
//                    "==== 微信 刷新access_token 错误，错误码={} 错误信息={}", jsonObject.getString("errcode"),
//                    jsonObject.getString("errmsg"));
//            return;
//        }
//
//        String accessToken = jsonObject.getString("access_token");
//        Long expiresInSecond = jsonObject.getLong("expires_in");
//
//        commonRedis.setValue(
//                RedisConstant.WECHAT_ACCESS_TOKEN, accessToken, expiresInSecond - 1000,
//                TimeUnit.SECONDS);
//    }
//
//    /**
//     * 获取微信access_token
//     *
//     * @return
//     */
//    public static String getAccessToken() {
//        String accessToken = (String) commonRedis.getValue(RedisConstant.WECHAT_ACCESS_TOKEN);
//        if (StringUtils.isEmpty(accessToken)) {
//            refreshAccessToken();
//            accessToken = (String) commonRedis.getValue(RedisConstant.WECHAT_ACCESS_TOKEN);
//        }
//        return accessToken;
//    }
//
//    /**
//     * 获取到用户填写的信息
//     *
//     * @param activateTicket
//     * @return
//     */
//    public static String getMemberCardActiveTempInfo(String activateTicket)
//            throws Exception {
//        StringBuffer url = new StringBuffer(
//                "https://api.weixin.qq.com/card/membercard/activatetempinfo/get?access_token=");
//        url.append(getAccessToken());
//
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("activate_ticket", activateTicket);
//
//        return HttpUtil.doPost(url.toString(), jsonObject.toJSONString());
//    }
//
//    /**
//     * 激活会员卡 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283
//     *
//     * @param oilCardId 加油卡卡号 @param code 领取会员卡用户获得的code @param cardId 卡券ID @return @throws
//     */
//    public static String activeMemberCard(String oilCardId, String code, String cardId)
//            throws Exception {
//        StringBuffer url =
//                new StringBuffer("https://api.weixin.qq.com/card/membercard/activate?access_token=");
//        url.append(getAccessToken());
//
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("init_bonus", 0);
//        jsonObject.put("init_balance", 0);
//        jsonObject.put("membership_number", oilCardId);
//        jsonObject.put("code", code);
//        jsonObject.put("card_id", cardId);
//        return HttpUtil.doPost(url.toString(), jsonObject.toJSONString());
//
//    }
//
//    /**
//     * 更新会员卡信息
//     *
//     * @param wechatCode    微信卡券code
//     * @param cardId        卡券ID
//     * @param balance       余额 元
//     * @param addBalance    余额变动值 负数表示减少
//     * @param recordBalance 金额消费记录 不超过14字
//     * @return
//     * @throws Exception
//     */
//    public static String updateMemberCard(String wechatCode, String cardId, String balance,
//                                          String addBalance, String recordBalance)
//            throws Exception {
//        StringBuffer url =
//                new StringBuffer("https://api.weixin.qq.com/card/membercard/updateuser?access_token=");
//        url.append(getAccessToken());
//
//        JSONObject rootObject = new JSONObject();
//        rootObject.put("code", wechatCode);
//        rootObject.put("card_id", cardId);
//        rootObject.put("balance", balance);
//        rootObject.put("add_balance", addBalance);
//        rootObject.put("record_balance", recordBalance);
//        return HttpUtil.doPost(url.toString(), rootObject.toJSONString());
//    }
//
//
//    /**
//     * 获取消息类型
//     *
//     * @param xml
//     * @return
//     * @throws Exception
//     */
//    public static String getMsgType(String xml)
//            throws Exception {
//        SAXReader saxReader = new SAXReader();
//        Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes()));
//        return document.getRootElement().elementText("MsgType");
//    }
//
//
//    /**
//     * 获取事件类型
//     *
//     * @param xml
//     * @return
//     * @throws Exception
//     */
//    public static String getEvent(String xml)
//            throws Exception {
//        SAXReader saxReader = new SAXReader();
//        Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes()));
//        return document.getRootElement().elementText("Event");
//    }
//
//    /**
//     * 对传入的数据提取摘要
//     *
//     * @param buffer
//     * @return
//     */
//    public final static String getMessageDigest(byte[] buffer) {
//        char hexDigits[] =
//                {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
//        try {
//            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
//            mdTemp.update(buffer);
//            byte[] md = mdTemp.digest();
//            int j = md.length;
//            char str[] = new char[j * 2];
//            int k = 0;
//            for (int i = 0; i < j; i++) {
//                byte byte0 = md[i];
//                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
//                str[k++] = hexDigits[byte0 & 0xf];
//            }
//            return new String(str);
//        } catch (Exception e) {
//            return null;
//        }
//    }
//
//    public static String getJsapiTiket()
//            throws Exception {
//        String tiket = (String) commonRedis.getValue(RedisConstant.WECHAT_JS_SDK_TIKET);
//        if (StringUtils.isNotEmpty(tiket)) {
//            return tiket;
//        }
//
//        StringBuffer url =
//                new StringBuffer("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=");
//        url.append(getAccessToken()).append("&type=jsapi");
//
//        String respStr = HttpUtil.doGet(url.toString());
//        JSONObject json = JSON.parseObject(respStr);
//        tiket = json.getString("ticket");
//        Long expiresInSecond = json.getLong("expires_in");
//
//        commonRedis.setValue(
//                RedisConstant.WECHAT_JS_SDK_TIKET, tiket, expiresInSecond - 1000, TimeUnit.SECONDS);
//        return tiket;
//    }
//
//    public static String getApiTiket()
//            throws Exception {
//        String tiket = (String) commonRedis.getValue(RedisConstant.WECHAT_API_TIKET);
//        if (StringUtils.isNotEmpty(tiket)) {
//            return tiket;
//        }
//
//        StringBuffer url =
//                new StringBuffer("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=");
//        url.append(getAccessToken()).append("&type=wx_card");
//
//        String respStr = HttpUtil.doGet(url.toString());
//        JSONObject json = JSON.parseObject(respStr);
//        tiket = json.getString("ticket");
//        Long expiresInSecond = json.getLong("expires_in");
//
//        commonRedis.setValue(
//                RedisConstant.WECHAT_API_TIKET, tiket, expiresInSecond - 1000, TimeUnit.SECONDS);
//        return tiket;
//    }
//
//    /**
//     * 生成自定义二维码，跳转微信会员卡
//     *
//     * @param inviteCode
//     * @return
//     * @author zhaozhihai
//     */
//    public static String createQRCode(String inviteCode) {
//        try {
//            String pubUrl = SysParamsUtil.getSysParams(SysParamConstant.SYS_PUB_URL);
//            String imgPath = SysParamsUtil.getSysParams(SysParamConstant.WECHAT_QRCODE_IMG_PATH);
//            String appId = SysParamsUtil.getSysParams(SysParamConstant.WECHAT_APPID);
//
//            String filename = Long.toString(System.currentTimeMillis()) + ".jpg";
//            File serverFile = new File(imgPath + "/" + filename);
//            if (!serverFile.getParentFile().exists()) {
//                serverFile.getParentFile().mkdirs();
//            }
//            FileOutputStream fos = new FileOutputStream(serverFile);
//            String redirectUrl = pubUrl + "/wechat/inviter/qrcode/scan?inviteCode=" + inviteCode;
//            StringBuilder urlBuf = new StringBuilder();
//            urlBuf
//                    .append("https://open.weixin.qq.com/connect/oauth2/authorize?appid=").append(appId);
//            urlBuf.append("&redirect_uri=").append(URLEncoder.encode(redirectUrl, "UTF-8"));
//            urlBuf.append("&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect");
//
//            String tips = "信联加油推荐码：" + inviteCode;
//            boolean result = QRCodeUtil.createQRCode(urlBuf.toString(), tips, 400, 400, fos);
//            LOGGER.info("是否生成二维码:", result);
//            if (result) {
//                String downType = Base64.encodeToString(SysParamConstant.WECHAT_QRCODE_IMG_PATH);
//                String name = Base64.encodeToString(filename);
//                return pubUrl + "/estation/downfile/" + downType + "/" + name;
//            }
//
//            return null;
//        } catch (Exception e) {
//            LOGGER.error("生成自定义二维码异常", e);
//        }
//        return null;
//    }
//
//    public static void setOpenIdToSession(HttpServletRequest request, String openid) {
//        request.getSession().setAttribute(SESSION_OPEN_ID, openid);
//    }
//
//    public static String getOpenIdFromSession(HttpServletRequest request) {
//        return (String) request.getSession().getAttribute(SESSION_OPEN_ID);
//    }
//
//    public void setCommonRedis(CommonRedis commonRedis) {
//        WechatUtil.commonRedis = commonRedis;
//    }
//
//    public static <T> T parseRequest(HttpServletRequest request) throws Exception {
//        String encryptJson = RequestUtil.getString(request);
//        if (StringUtils.isEmpty(encryptJson)) {
//            LOGGER.info("... . . .-. 请求参数为空 {}", encryptJson);
//        }
//        return (T) JSONObject.parseObject(encryptJson);
//    }
//}
